package com.newsmanagement.dao;

import com.newsmanagement.entity.EumEntity;
import com.newsmanagement.entity.NewsCategoryEntity;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * @author xbr
 * 2017/12/5
 * 新闻分类操作
 */
@Mapper
public interface INewsCategoryServiceDao {

    /**
     * 查询分类信息总条数
     * @return int
     */
    @Select("SELECT COUNT(*) FROM NEWS_CATEGORY_T WHERE DELETE_FLAG = 1")
    int getNewcategoryListCount();

    /**
     * 查询分类信息
     * @return List
     */
    @Select("SELECT * FROM NEWS_CATEGORY_T WHERE DELETE_FLAG = 1 ORDER BY ORDER_NUMBER")
    List<Map<String ,Object>> getNewcategoryList();

    /**
     * 查询分类信息
     * @return List
     */
    @Select("SELECT * FROM NEWS_CATEGORY_T WHERE DELETE_FLAG = 1 ORDER BY ORDER_NUMBER")
    @Results({
            @Result(property = "categoryId", column = "CATEGORY_ID"),
            @Result(property = "categoryName", column = "CATEGORY_NAME"),
            @Result(property = "orderNumber", column = "ORDER_NUMBER"),
            @Result(property = "deleteFlag", column = "DELETE_FLAG")
    })
    List<NewsCategoryEntity> getNewcategoryListTest();


    /**
     * 根据分类名称查询对应的分类信息
     * 此方法用于添加分类时的判断，查询时包含逻辑删除的数据
     * @param categoryName 分类名称
     * @return List
     */
    @Select("SELECT * FROM NEWS_CATEGORY_T WHERE CATEGORY_NAME = #{arg0}")
    List<Map<String ,Object>> getNewcategoryListByName(String categoryName);

    /**
     * 根据分类名称查询对应的分类信息
     * 此方法用于添加分类时的判断，查询时包含逻辑删除的数据
     * @param categoryId 分类id
     * @return List
     */
    @Select("SELECT * FROM NEWS_CATEGORY_T WHERE CATEGORY_ID = #{arg0}")
    Map<String ,Object> getNewcategoryListById(Integer categoryId);

    /**
     * 根据分类名称激活对应的分类信息
     * @param categoryName 分类信息
     * @return int 修改的数据条数
     */
    @Update("update NEWS_CATEGORY_T set DELETE_FLAG = 1 ,ORDER_NUMBER = LAST_INSERT_ID() where CATEGORY_NAME = #{arg0}")
    int updateNewscategoryByCategoryNameForActivation(String categoryName);

    /**
     * 根据分类名称修改激活的分类信息的排序等级（最后，即当前自增主键的最大值）
     * @param categoryName 分类信息
     * @return int 修改的数据条数
     */
    @Update("update NEWS_CATEGORY_T set ORDER_NUMBER = LAST_INSERT_ID() where CATEGORY_NAME = #{arg0}")
    int updateNewscategoryMaxOrderNumberByName(String categoryName);

    /**
     * 根据分类id修改激活的分类信息的排序等级（最后，即当前自增主键的最大值）
     * @param categoryId 分类id
     * @return int 修改的数据条数
     */
    @Update("UPDATE NEWS_CATEGORY_T a , (SELECT  MAX(CATEGORY_ID)+1 CATEGORY_ID  FROM NEWS_CATEGORY_T ) b SET a.ORDER_NUMBER =b.CATEGORY_ID  WHERE a.CATEGORY_ID = #{arg0}")
    int updateNewscategoryMaxOrderNumberById(Integer categoryId);

    /**
     * 按排序从小到大的顺序获取当前分类前一条数据信息：用于上移
     * 此方法用于新闻分类排序调整，查询时不包含逻辑删除的数据
     * @param orderNumber 序号
     * @return Map<String ,Object>
     */
    @Select("SELECT * FROM NEWS_CATEGORY_T WHERE DELETE_FLAG = 1 AND ORDER_NUMBER < #{arg0} ORDER BY ORDER_NUMBER DESC LIMIT 1")
    Map<String ,Object> getNewcategoryPreviousById(Integer orderNumber);

    /**
     * 按排序从小到大的顺序获取当前分类后一条数据信息:用于下移
     * 此方法用于新闻分类排序调整，查询时不包含逻辑删除的数据
     * @param orderNumber 序号
     * @return Map<String ,Object>
     */
    @Select("SELECT * FROM NEWS_CATEGORY_T WHERE DELETE_FLAG = 1 AND ORDER_NUMBER > #{arg0} ORDER BY ORDER_NUMBER LIMIT 1")
    Map<String ,Object> getNewcategoryLastOneById(Integer orderNumber);

    /**
     * 根据分类id将传递的排序存入
     * 同下方moveCatatoryOrder方法是一套
     * @param categoryId 分类id
     * @param orderNumber 序号
     * @return int 修改的数据条数
     */
    @Update("UPDATE NEWS_CATEGORY_T SET ORDER_NUMBER = #{arg1} WHERE CATEGORY_ID = #{arg0}")
    int moveCatatoryUpperOrNext(Integer categoryId ,Integer orderNumber);

    /**
     * 根据分类id修改激活的分类信息的排序等级（最前，即1）
     * @param categoryId 分类id
     * @return int 修改的数据条数
     */
    @Update("update NEWS_CATEGORY_T set ORDER_NUMBER = 1 where CATEGORY_ID = #{arg0}")
    int updateNewscategoryMinOrderNumberById(Integer categoryId);

    /**
     * 根据分类名称修改激活的分类信息的排序等级（最后，即当前自增主键的最大值）
     * @param categoryName 分类信息
     * @param orderNumber 激活分类的排序
     * @return int 修改的数据条数
     */
    @Update("UPDATE NEWS_CATEGORY_T SET ORDER_NUMBER = ORDER_NUMBER - 1 WHERE ORDER_NUMBER > #{arg1} AND CATEGORY_NAME != #{arg0}")
    int updateNewscategoryOrderNumberMinusOne(String categoryName ,Integer orderNumber);

    /**
     * 根据分类名称修改激活的分类信息的排序等级（最后，即当前自增主键的最大值）
     * @param categoryName 分类信息
     * @param orderNumber 激活分类的排序
     * @return int 修改的数据条数
     */
    @Update("UPDATE NEWS_CATEGORY_T SET ORDER_NUMBER = ORDER_NUMBER + 1 WHERE ORDER_NUMBER < #{arg1} AND CATEGORY_NAME != #{arg0}")
    int updateNewscategoryOrderNumberAddOne(String categoryName ,Integer orderNumber);


    /**
     * 添加新闻分类信息
     * @param categoryName 分类名称
     * @return
     */
    @Insert("INSERT INTO NEWS_CATEGORY_T (ORDER_NUMBER, CATEGORY_NAME) SELECT DISTINCT LAST_INSERT_ID() + 1,#{arg0} FROM NEWS_CATEGORY_T")
    int addNewscategory(String categoryName);

    /**
     * 根据用户主键id删除对应的用户信息（逻辑删除）
     * @param categoryId 新闻分类主键id
     * @return int 删除数据条数
     */
    @Update("update NEWS_CATEGORY_T set DELETE_FLAG = 0 where CATEGORY_ID = #{arg0}")
    int deleteNewscategoryByCategoryId(Integer categoryId);

    /**
     * 根据用户主键修改对应的用户信息
     * @param categoryId 新闻分类id
     * @param categoryName 新闻分类名称
     * @return int 修改的数据条数
     */
    @Update("update NEWS_CATEGORY_T set CATEGORY_NAME = #{arg1} where CATEGORY_ID = #{arg0}")
    int updateNewscategoryNameByCategoryId(Integer categoryId ,String categoryName);
}
